/**
////我们有一个由平面上的点组成的列表 points。需要从中找出 K 个距离原点 (0, 0) 最近的点。 
////
//// （这里，平面上两点之间的距离是欧几里德距离。） 
////
//// 你可以按任何顺序返回答案。除了点坐标的顺序之外，答案确保是唯一的。 
////
//// 
////
//// 示例 1： 
////
//// 输入：points = [[1,3],[-2,2]], K = 1
////输出：[[-2,2]]
////解释： 
////(1, 3) 和原点之间的距离为 sqrt(10)，
////(-2, 2) 和原点之间的距离为 sqrt(8)，
////由于 sqrt(8) < sqrt(10)，(-2, 2) 离原点更近。
////我们只需要距离原点最近的 K = 1 个点，所以答案就是 [[-2,2]]。
//// 
////
//// 示例 2： 
////
//// 输入：points = [[3,3],[5,-1],[-2,4]], K = 2
////输出：[[3,3],[-2,4]]
////（答案 [[-2,4],[3,3]] 也会被接受。）
//// 
////
//// 
////
//// 提示： 
////
//// 
//// 1 <= K <= points.length <= 10000 
//// -10000 < points[i][0] < 10000 
//// -10000 < points[i][1] < 10000 
//// 
//// Related Topics 几何 数组 数学 分治 快速选择 排序 堆（优先队列） 👍 305 👎 0
//

*/

package com.xixi.dataStructure.heap;

import java.util.Comparator;
import java.util.PriorityQueue;

public class ID00973KClosestPointsToOrigin {
public static void main(String[] args) {

    Solution solution = new ID00973KClosestPointsToOrigin().new Solution();

    System.out.println(solution.kClosest(new int[][]{{1,3},{-2,2}}, 1));

}


//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int[][] kClosest(int[][] points, int k) {

        //声明一个K大小的大顶堆,保存length和下标
        PriorityQueue<int[]> queue = new PriorityQueue<int[]>(k, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o2[0] - o1[0];
            }
        });


        for(int i = 0; i < points.length; ++i) {
            int distance = points[i][0] * points[i][0] + points[i][1] * points[i][1];
            if(i < k){//小于K的时候直接建堆
                queue.add(new int[]{distance, i}); //建堆
            }else{//大于K的时候，取出堆顶的
                if(distance >= queue.peek()[0]){ //比堆顶值大，就不要了
                    continue;
                }else{//比堆顶值小，就弹出
                    queue.poll();
                    queue.add(new int[]{distance, i});
                }
            }

        }

        int[][] result = new int[k][2];
        for(int r = 0; r < k ; ++r){
            result[r] = points[queue.poll()[1]];
        }
        return result;
    }
}
//leetcode submit region end(Prohibit modification and deletion)




}